package pharao.client.views.game.landkarte.ort.status;

import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

import pharao.client.dto.AufgabenStatusDTO;
import pharao.client.dto.OrtStatusDTO;
import pharao.client.i18ln.GuiText;
import pharao.client.views.events.GetModelDataEvent;
import pharao.client.views.events.SetModelDataEvent;
import pharao.client.views.game.landkarte.ort.basics.events.ShowOrtBasicViewEvent;

import hmvc4gwt.client.event.IHmvcEvent;
import hmvc4gwt.framework.client.events.CloseViewEvent;
import hmvc4gwt.framework.client.view.GuiView;

public class OrtStatusView extends GuiView {
	
	/**
	 * Zurücklink
	 */
	private Hyperlink hyperlinkBack = new Hyperlink(GuiText.constants.link_back(), null);
	
	/**
	 * enthält eine Beschreibung der Seite
	 */
	private Label labelBeschreibung = new Label(GuiText.constants.text_game_map_ort_status());
	
	/**
	 * enthält alle Status-Tabellen
	 */
	private VerticalPanel panelStatusTables = new VerticalPanel();
	
	private void addAllStatusTable(OrtStatusDTO ortStatusDTO) {
		
		/*
		 * aktuelle Anzeige löschen
		 */
		remove(panelStatusTables);
		panelStatusTables.clear();
		
		/*
		 * Status der Prüfungen hinzufügen
		 */
		Label labelExam = new Label(GuiText.constants.text_game_map_ort_status_exam());
		labelExam.setStylePrimaryName("header1");
		panelStatusTables.add(labelExam);
		addExamStatus(ortStatusDTO);
		
		/*
		 * Status der Übungen hinzufügen
		 */
		Label labelTraining = new Label(GuiText.constants.text_game_map_ort_status_training());
		labelTraining.setStylePrimaryName("header1");
		panelStatusTables.add(labelTraining);
		
		addTrainingStatus(ortStatusDTO, AufgabenStatusDTO.TYP_ADDITION);
		addTrainingStatus(ortStatusDTO, AufgabenStatusDTO.TYP_SUBTRAKTION);
		addTrainingStatus(ortStatusDTO, AufgabenStatusDTO.TYP_MULTIPLIKATION);
		addTrainingStatus(ortStatusDTO, AufgabenStatusDTO.TYP_DIVISION);
		
		/*
		 * panel anzeigen
		 */
		add(panelStatusTables);
	}

	private void addExamStatus(OrtStatusDTO ortStatusDTO) {
		/*
		 * Gold, Silber, Bronce-Prüfungen
		 */
		FlexTable flexTable = new FlexTable();
		flexTable.setStylePrimaryName("ortStatusTable");
		
		flexTable.setWidget(1, 0, new Label("Gold"));
		flexTable.setWidget(2, 0, new Label("Silber"));
		flexTable.setWidget(3, 0, new Label("Bronce"));
		
		/*
		 * Bestanden
		 */
		flexTable.setWidget(0, 1, new Label("Teilgenommen"));
		flexTable.setWidget(0, 2, new Label("Bestanden"));
		flexTable.setWidget(0, 3, new Label("in %"));
		
		/*
		 * Testergebenisse
		 */
		flexTable.setWidget(1, 1, new Label("0"));
		flexTable.setWidget(2, 1, new Label("2"));
		flexTable.setWidget(3, 1, new Label("3"));
		
		flexTable.setWidget(1, 2, new Label("0"));
		flexTable.setWidget(2, 2, new Label("1"));
		flexTable.setWidget(3, 2, new Label("3"));
		
		flexTable.setWidget(1, 3, new Label("0"));
		flexTable.setWidget(2, 3, new Label("50"));
		flexTable.setWidget(3, 3, new Label("100"));
		
		panelStatusTables.add(flexTable);
	}
	
	private void addTrainingStatus(OrtStatusDTO ortStatusDTO, int aufgabenTyp) {
		
		FlexTable tableStatus = new FlexTable();
		tableStatus.setStylePrimaryName("ortStatusTable");
		
		/*
		 * Tabellenkopf
		 */
		Label label0 = new Label(GuiText.constants.text_game_map_ort_status_table_type());
		Label label1 = new Label(GuiText.constants.text_game_map_ort_status_table_difficulty());
		Label label2 = new Label(GuiText.constants.text_game_map_ort_status_table_countLessons());
		Label label3 = new Label(GuiText.constants.text_game_map_ort_status_table_lessonsPassed());
		Label label4 = new Label(GuiText.constants.text_game_map_ort_status_table_inPercent());
		Label label5 = new Label(GuiText.constants.text_game_map_ort_status_table_lessonsFalsed());
		Label label6 = new Label(GuiText.constants.text_game_map_ort_status_table_inPercent());
	
		/*
		 * Style setzen
		 */
		label0.setStylePrimaryName("tableHeadText");
		label1.setStylePrimaryName("tableHeadText");
		label2.setStylePrimaryName("tableHeadText");
		label3.setStylePrimaryName("tableHeadText");
		label4.setStylePrimaryName("tableHeadText");
		label5.setStylePrimaryName("tableHeadText");
		label6.setStylePrimaryName("tableHeadText");
		
		/*
		 * TabelHead hinzufügen
		 */
		tableStatus.setWidget(0, 0, label0);
		tableStatus.setWidget(0, 1, label1);
		tableStatus.setWidget(0, 2, label2);
		tableStatus.setWidget(0, 3, label3);
		tableStatus.setWidget(0, 4, label4);
		tableStatus.setWidget(0, 5, label5);
		tableStatus.setWidget(0, 6, label6);				
		
		/*
		 * anzeige des Addition-Status 
		 */
		if (aufgabenTyp == 0) {
			tableStatus.setWidget(1, 0, new Label(GuiText.constants.link_game_ort_basics_addition()));
		} else if (aufgabenTyp == 1) {
			tableStatus.setWidget(1, 0, new Label(GuiText.constants.link_game_ort_basics_subtraktion()));
		} else if (aufgabenTyp == 2) {
			tableStatus.setWidget(1, 0, new Label(GuiText.constants.link_game_ort_basics_multiplikation()));
		} else if (aufgabenTyp == 3) {
			tableStatus.setWidget(1, 0, new Label(GuiText.constants.link_game_ort_basics_divisison()));
		}
		
		/*
		 * Schwierigkeitsgrad
		 */
		tableStatus.setWidget(1, 1, new Label("Gold"));
		tableStatus.setWidget(2, 1, new Label("Silber"));
		tableStatus.setWidget(3, 1, new Label("Bronce"));
		
		/*
		 * Anzahl der gerechneten Aufgaben
		 */
		int countGold 		= ortStatusDTO.getCountOfTyp(aufgabenTyp, AufgabenStatusDTO.DIFFICULTY_GOLD);
		int countSilber		= ortStatusDTO.getCountOfTyp(aufgabenTyp, AufgabenStatusDTO.DIFFICULTY_SILBER);
		int countBronce		= ortStatusDTO.getCountOfTyp(aufgabenTyp, AufgabenStatusDTO.DIFFICULTY_BRONCE);
		tableStatus.setWidget(1, 2, new Label ("" + countGold));
		tableStatus.setWidget(2, 2, new Label ("" + countSilber));
		tableStatus.setWidget(3, 2, new Label ("" + countBronce));
		
		/*
		 * Richtig
		 */
		float passedGold 		= ortStatusDTO.getCountOfPassed(aufgabenTyp, AufgabenStatusDTO.DIFFICULTY_GOLD);
		float passedSilber	= ortStatusDTO.getCountOfPassed(aufgabenTyp, AufgabenStatusDTO.DIFFICULTY_SILBER);
		float passedBronce	= ortStatusDTO.getCountOfPassed(aufgabenTyp, AufgabenStatusDTO.DIFFICULTY_BRONCE);
		tableStatus.setWidget(1, 3, new Label ("" + passedGold));
		tableStatus.setWidget(2, 3, new Label ("" + passedSilber));
		tableStatus.setWidget(3, 3, new Label ("" + passedBronce));
		
		/*
		 * Richtig in %
		 */
		float passedGoldPercent 	= 0;
		if ((passedGold != 0) && (countGold != 0)) {
			passedGoldPercent 		= (passedGold / countGold) * 100;
		}
		
		float passedSilberPercent 	= 0;
		if ((passedSilber != 0) && (countSilber != 0)) {
			passedSilberPercent 	= (passedSilber / countSilber) * 100;
		}
		
		float passedBroncePercent 	= 0;
		if ((passedBronce != 0) && (countBronce != 0)) {
			passedBroncePercent 	= ((passedBronce / countBronce) * 100);
		}
		
		tableStatus.setWidget(1, 4, new Label ("" + passedGoldPercent));
		tableStatus.setWidget(2, 4, new Label ("" + passedSilberPercent));
		tableStatus.setWidget(3, 4, new Label ("" + passedBroncePercent));
		
		/*
		 * Falsch
		 */
		float falsedGold	= ortStatusDTO.getCountOfFalsed(aufgabenTyp, AufgabenStatusDTO.DIFFICULTY_GOLD);
		float falsedSilber	= ortStatusDTO.getCountOfFalsed(aufgabenTyp, AufgabenStatusDTO.DIFFICULTY_SILBER);
		float falsedBronce	= ortStatusDTO.getCountOfFalsed(aufgabenTyp, AufgabenStatusDTO.DIFFICULTY_BRONCE);
		tableStatus.setWidget(1, 5, new Label ("" + falsedGold));
		tableStatus.setWidget(2, 5, new Label ("" + falsedSilber));
		tableStatus.setWidget(3, 5, new Label ("" + falsedBronce));
		
		/*
		 * Falsch in %
		 */
		float falsedGoldPercent = 0;
		if ((falsedGold != 0) && (countGold != 0)) {
			falsedGoldPercent = (falsedGold / countGold) * 100;
		}
		
		float falsedSilberPercent = 0;
		if ((falsedSilber != 0) && (countSilber != 0)) {
			falsedSilberPercent = (falsedSilber / countSilber) * 100;
		}
		
		float falsedBroncePercent = 0;
		if ((falsedBronce != 0) && (countBronce != 0)) {
			falsedBroncePercent 	= (falsedBronce / countBronce) * 100;
		}
		
		tableStatus.setWidget(1, 6, new Label ("" + falsedGoldPercent));
		tableStatus.setWidget(2, 6, new Label ("" + falsedSilberPercent));
		tableStatus.setWidget(3, 6, new Label ("" + falsedBroncePercent));
		
		panelStatusTables.add(tableStatus);
		
	}

	public void initImpl() {
		
		getController().register(SetModelDataEvent.class, this);
		
		labelBeschreibung.setStylePrimaryName("text");
		
		ClickListener listener = new ClickListener() {
			public void onClick(Widget sender) {
				hyperlinkAction(sender);
			}
		};
		
		hyperlinkBack.addClickListener(listener);

		add(labelBeschreibung);
		add(hyperlinkBack);

		getController().fireEventLocal(new GetModelDataEvent());
	}
	
	public void handleEventImpl(IHmvcEvent event) {
		
		if (event instanceof SetModelDataEvent) {
			if (event.getPayload() instanceof OrtStatusDTO) {
				addAllStatusTable((OrtStatusDTO) event.getPayload());
			}
			
		}
	}
	
	private void hyperlinkAction(Widget sender) {
		
		if (sender == hyperlinkBack) {
			
			getController().fireEventLocal(new CloseViewEvent());
			getController().fireEvent(new ShowOrtBasicViewEvent(), true, false, false);
			
		}
		
	}
	
	public void terminate() {
		// TODO Auto-generated method stub
		
	}

	

}
